サーブレットでiPhoneアプリからのリクエストパラメータをうまく取得できなかった話


個人でiPhoneアプリを作成していたところ、getAttribute（）とgetParameter（）の違いを理解しておらず、
サーブレットでアプリからのリクエストをうまく取得できなかったのでメモとして残しておきます。

今回発生した事象はこんな感じ。

iPhoneアプリからリクエスト送信　
　　　　↓
サーブレットで受信（サーブレットに到達はするが、リクエスト内のパラメータが取得できない。。）

##原因##
request.getAttributeで値を取得しようとしていたのがダメでした。
getParameterで取得しないとダメみたいですね。。
~~（jspはgetAttributeで取得できていたので完全に盲点でした）~~
2020.05.22追記
↑取得できてませんでした。そもそもsetAttributeとgetAttributeをごちゃごちゃになっていたのでハマっていた様です。。
このサイトで勉強しなおしました。→　[getAttribute()メソッド。](https://www.marguerite.jp/Nihongo/WWW/RefDOM/getAttribute.html#NOTES"getAttribute()メソッド。")

詳しい内容はこちらのサイトに記載してありました。
[・getAttribute（）とgetParameter（）の違い](https://www.it-swarm.dev/ja/java/getattribute（）とgetparameter（）の違い/971401730/"getAttribute（）とgetParameter（）の違い")

##検証##
理解を深めるためにサンプルプログラムで検証してみました。
iPhoneのtextFieldに入力された文字列をコンソールに表示するサンプルプログラムです。

###・iPhone画面###
　![input.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640581/a4e60310-cbff-e987-819a-5af25bd8e306.jpeg)　**→**　![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640581/ff64f1a3-f52c-3311-b46e-fd6e3c608ded.png)

##結果##
###・コンソール画面###
![コンソール結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640581/c61548bc-62d3-4b68-d86c-c0dd910e744a.png)
やはりgetAttributeだと取得できていませんでした

##ソース##
**・iPhone画面　（入力画面）**

```swift:ViewController 
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var testField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    //Servletに送信ボタンを押した際に実行
    @IBAction func goServlet(_ sender: Any) {
        self.performSegue(withIdentifier: "goResultView", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        print("prepare動作開始")
        //URLを設定
        guard let req_url = URL(string: "http://localhost:8080/Test/TestServlet")
            else{return}
        print("urlセット完了")
        
        //リクエストに必要な情報を宣言
        var req = URLRequest(url: req_url)
        print("リクエストの宣言")
        //POSTを指定
        req.httpMethod = "POST"
        //POSTするデータをBODYとして設定
        req.httpBody = "test=\(self.testField.text!)".data(using: .utf8)
        
        //sessionの作成
        let session = URLSession(configuration: .default,delegate: nil, delegateQueue: OperationQueue.main)
        print("sessionの作成")

                //リクエストをタスクとして登録
                let task = session.dataTask(with: req, completionHandler: {
                    (data, response ,error) in
        

                })
                //request送信
                task.resume()
            }
   
}
```

**・iPhone画面　（結果画面）**
※iPhoneの結果画面にはswiftコードを定義してません

**・Java Servlet**

```java:TestServlet
package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class testServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub

		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		System.out.println("サーブレットのPOSTメソッドに到達");
		System.out.println("getAttributeで受け取った場合：" + "iPhoneアプリから送られた文字列は" + request.getAttribute("test") + "です。");
		System.out.println("getParameterで受け取った場合：" + "iPhoneアプリから送られた文字列は" + request.getParameter("test") + "です。");
	}

}
```