個人でiPhoneアプリを作成していたところ、getAttribute()とgetParameter()の違いを理解しておらず、
サーブレットでアプリからのリクエストをうまく取得できなかったのでメモとして残しておきます。
今回発生した事象はこんな感じ。
iPhoneアプリからリクエスト送信
↓
サーブレットで受信(サーブレットに到達はするが、リクエスト内のパラメータが取得できない。。)
##原因##
request.getAttributeで値を取得しようとしていたのがダメでした。
getParameterで取得しないとダメみたいですね。。
(jspはgetAttributeで取得できていたので完全に盲点でした)
2020.05.22追記
↑取得できてませんでした。そもそもsetAttributeとgetAttributeをごちゃごちゃになっていたのでハマっていた様です。。
このサイトで勉強しなおしました。→ getAttribute()メソッド。
詳しい内容はこちらのサイトに記載してありました。
・getAttribute()とgetParameter()の違い
##検証##
理解を深めるためにサンプルプログラムで検証してみました。
iPhoneのtextFieldに入力された文字列をコンソールに表示するサンプルプログラムです。
##結果##
###・コンソール画面###
やはりgetAttributeだと取得できていませんでした
##ソース##
・iPhone画面 (入力画面)
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
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") + "です。");
}
}